home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
lisp
/
eulisp
/
mpfeel.lha
/
MPFeel
/
Plurals
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-23
|
8KB
|
342 lines
#include <stdio.h>
#include <strings.h>
#include "debug.h"
#include "constant.h"
#include "mp_eubang.h"
#include "mp_arith.h"
#define CONTEXT 1
typedef char *mp_word;
#define DBG(x)
#define DEBUG(x)
struct Variable_ {
char name[20];
char *context;
mp_word value;
struct Variable_ *next;
};
typedef struct Variable_ Variable;
Variable *root = NULL;
Variable *add_variable();
Variable *find_variable();
char fe_scratch[1024][64];
char *pe_scratch;
int main()
{
char *null=0;
char command[80];
char name[80];
char number[20];
int length;
Variable *context;
Variable *current;
Variable *arg1;
Variable *arg2;
int data[1024];
char des[64];
int index,value;
int tmp_result;
int command_id;
int transferred;
static int std_cons_des[20] = {20, 2, 1, 1, 2, 1, 2, 2, 1, 3, 2, 1, 4, 2, 1, 5, 2, 1, 6, 0};
int des_length;
float f_value;
int i;
DBG_CALL("main");
DBG_ARGS(fprintf(dbg,"void"));
DEBUG(fprintf(dbg,"first four bytes of zero = %08lx\n",zero));
if ((pe_scratch=(char *)callRequest(mp_init_plural,0)) == FAIL) exit(1);
while ((scanf("%s",command) != EOF) && (strcmp(command,"quit") != 0))
{
if (strcmp(command, "new") == 0) {
scanf("%s",name);
current = add_variable( name );
scanf("%d",&length);
current->context = callRequest(mp_make_context,4,length);
current->value = callRequest(mp_make_plural,4,current->context);
}
else if (strcmp(command, "make") == 0) {
scanf("%s",name);
current = add_variable( name );
scanf("%s",name);
context = add_variable( name );
current->context = context->context;
current->value = callRequest(mp_make_plural,4,current->context);
}
else if (strcmp(command, "debug") == 0) {
*null=9;
}
else if((strcmp(command,"set")==0) || ((strcmp(command,"bang")==0))) {
scanf("%s",name);
current = add_variable( name );
scanf("%s",number);
if (strstr(number, "#") != 0) {
sscanf(&number[1],"%d",&value);
des_length = sizeof(int);
des[(des_length)++] = MP_VECTOR;
des[(des_length)++] = value;
for (i = 0; i< value; i++) des[(des_length)++] = 0;
memcpy(des, (char *) &des_length, sizeof(int));
}
else if (strstr(number,".") == 0) {
sscanf(number,"%d",&value);
des_length = sizeof(int);
des[(des_length)++] = INTEGER;
memcpy(des+des_length, (char *) &value, sizeof(int));
des_length = des_length + sizeof(int);
memcpy(des, (char *) &des_length, sizeof(int));
}
else {
sscanf(number, "%f", &f_value);
des_length = sizeof(int);
des[(des_length)++] = MP_FLOAT;
memcpy(des+des_length, (char *) &f_value, sizeof(int));
des_length = des_length + sizeof(float);
memcpy(des, (char *) &des_length, sizeof(int));
}
if (strcmp(command, "bang") == 0) {
callRequest(mp_plural,24,current->context,MP_BANG,2,1,
current->value,des);
}
else {
scanf("%d",&index);
callRequest(mp_plural,28,current->context,MP_SET,3,1,
current->value,index,des);
}
}
else if (strcmp(command,"vecs") == 0) {
scanf("%s",name);
current = add_variable( name );
scanf("%s",name);
arg1 = add_variable( name );
current->context = arg1->context;
current->value = callRequest(mp_plural,20,arg1->context,MP_MAKE_VECTOR,
1,1,arg1->value);
}
else if (strcmp(command, "if") == 0) {
scanf("%s",name);
current = add_variable( name );
callRequest(mp_plural,20,current->context,MP_IF,1,1,current->value);
}
else if (strcmp(command, "else") == 0) {
scanf("%s",name);
current = add_variable( name );
callRequest(mp_plural,20,current->context,MP_ELSE,1,1,current->value);
}
else if (strcmp(command, "ctxt") == 0) {
scanf("%s",name);
current = add_variable( name );
callRequest(mp_plural,20,current->context,MP_CONTEXT,1,1,
current->value);
transferred = blockIn(pe_scratch,fe_scratch,0,0,32,32,64);
fprintf(stdout,"#P( ");
for(i=0;i<1024;i++) {
if (fe_scratch[i][0] != NULL)
fprintf(stdout,"%s ",&fe_scratch[i][0]);
}
fprintf(stdout,")\n");
}
else if (strcmp(command, "assign") == 0) {
scanf("%s",name);
current = add_variable( name );
scanf("%s",name);
arg1 = add_variable( name );
callRequest(mp_plural,24,current->context,MP_ASSIGN,2,2,
current->value,arg1->value);
}
else if (strcmp(command, "fi") == 0) {
scanf("%s",name);
current = add_variable( name );
callRequest(mp_plural,20,current->context,MP_FI,1,1,current->value);
}
else if (strcmp(command, "=") == 0) {
scanf("%s",name);
current = add_variable( name );
scanf("%s",command);
command_id = command[0];
scanf("%s",name);
arg1 = add_variable( name );
scanf("%s",name);
arg2 = add_variable( name );
current->context = arg1->context;
switch (command_id) {
case '+' :
current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
arg1->value,arg2->value,MP_PLUS);
break;
case '-' :
current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
arg1->value,arg2->value,MP_DIFFERENCE);
break;
case '/' :
current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
arg1->value,arg2->value,MP_DIVIDE);
break;
case '*' :
current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
arg1->value,arg2->value,MP_TIMES);
break;
case '%' :
current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
arg1->value,arg2->value,MP_REMAINDER);
break;
case '=' :
current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
arg1->value,arg2->value,MP_EQ);
break;
case '<' :
current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
arg1->value,arg2->value,MP_LT);
break;
case '>' :
current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
arg1->value,arg2->value,MP_GT);
break;
case '2' :
current->value=callRequest(mp_plural,24,arg1->context,MP_MP_CONS,2,2,
arg1->value, arg2->value);
break;
case 'v' :
current->value = callRequest(mp_plural,28,arg1->context,
MP_VECTOR_SET,3,3,current->value,
arg1->value,arg2->value);
break;
/* case 'i' :
tmp_result = callRequest(cm_identify,16,
arg1->context, arg1->value,
arg2->context, arg2->value);
current->value = *((unsigned short int *) &tmp_result);
current->context = *(((unsigned short int *) &tmp_result) +1);
case 'm' :
current->value = callRequest(mp_match,8,arg1->value,arg2->value);
break;
case 's' :
current->value = callRequest(mp_move,8,arg1->value,arg2->value);
break;
*/
}
}
else {
current = find_variable( command );
}
if (current == NULL) {
printf("\nNo Variable ...\n");
}
else {
printf("\nVariable Name : %s\n",current->name);
printf(" mp_object : %lx\n\n", current->value);
callRequest(mp_plural,20,current->context,MP_PRINT,1,1,
current->value);
transferred = blockIn(pe_scratch,fe_scratch,0,0,32,32,64);
fprintf(stdout,"#P( ");
for(i=0;i<1024;i++) {
if (fe_scratch[i][0] != NULL)
fprintf(stdout,"%s ",&fe_scratch[i][0]);
}
fprintf(stdout,")\n");
}
}
DBG_EXIT(fprintf(dbg,"void"));
}
Variable *find_variable( variable_name )
{
Variable *current = root;
DBG_CALL("find_varaiable");
DBG_ARGS(fprintf(dbg,"variable_name=\"%s\"",variable_name));
while (current != NULL)
if (strcmp(current->name, variable_name)==0) {
DBG_EXIT(fprintf(dbg,"%lx",current));
return current;
}
else current=current->next;
DBG_EXIT(fprintf(dbg,"NULL"));
return NULL;
}
Variable *add_variable( variable_name )
{
Variable *variable;
DBG_CALL("add_variable");
DBG_ARGS(fprintf(dbg,"variable_name=\"%s\"",variable_name));
variable = find_variable( variable_name );
if (variable != NULL) {
DBG_EXIT(fprintf(dbg,"%lx",variable));
return variable;
}
variable = (Variable *) malloc( sizeof( Variable ) );
strcpy(variable->name, variable_name);
variable->next = root;
variable->value = NULL;
variable->context = NULL;
root = variable;
DBG_EXIT(fprintf(dbg,"%lx",variable));
return variable;
}